#ifndef _ICAR_PARSE_H
#define _ICAR_PARSE_H

#include "icar.h"
#include "icar_msg.h"

#ifdef __cplusplus
extern "C" {
#endif

/* 存储接收的终端消息的消息体 */
struct msgBody {
	int index;			/* 消息包的索引，用于标注消息包序号 */
	uint16_t sequence;	/* 消息包序列号 */
	int len;			/* 消息体的长度 */
	uint8_t data[1024];	/* 一个包的消息体最长为1023字节 */
};

/* 存储接收的消息 */
struct msgRecv {
	uint16_t id;		/* 消息ID */
	time_t	last;		/* 接收最后一个消息包的时间 */
	char number[16];		/* 车机号码 */

	uint16_t total;			/* 总包数 */
	uint16_t cnt;			/* 已接收包的个数 */
	struct msgBody m[0];	/* 接收消息的消息体 */
	struct msgRecv *next;	
};

struct msgclient {
	int fd;				/* 终端客户端的socket描述符 */
	struct msgRecv *msg;	/* 存储的消息体 */
};

struct msg_handle {
	uint16_t id;				/* 消息ID*/
	/* 对终端消息体进行解析，并将具体数据存储于参数arg*/
	int (*parse)(uint8_t *data, size_t size, void *arg);
	void (*handle)(int rsa, const char *number, void *arg);
	void (*free)(void *arg);	/* 对解析消息中分配的内存进行释放 */
};

int icar_parse_pkg(uint8_t *buf, size_t size, struct msgclient *client);

/* 对已经将分散包组包后的完整消息体进行处理 */
void icar_parse_msg(uint8_t *buf, size_t size, uint16_t id, const char *number, int fd);

#ifdef __cplusplus
}
#endif

#endif
